மேம்பட்ட டைப்ஸ்கிரிப்ட் ஜெனரிக்ஸ்: கட்டுப்பாடுகள், பயன்பாட்டு வகைகள், அனுமானம் மற்றும் உலகளாவிய சூழலில் வலுவான, மீண்டும் பயன்படுத்தக்கூடிய குறியீட்டை எழுதுவதற்கான நடைமுறைப் பயன்பாடுகளை ஆராயுங்கள்.
டைப்ஸ்கிரிப்ட் ஜெனரிக்ஸ்: மேம்பட்ட பயன்பாட்டு முறைகள்
டைப்ஸ்கிரிப்ட் ஜெனரிக்ஸ் ஒரு சக்திவாய்ந்த அம்சமாகும், இது மிகவும் நெகிழ்வான, மீண்டும் பயன்படுத்தக்கூடிய மற்றும் வகை-பாதுகாப்பான குறியீட்டை எழுத உங்களை அனுமதிக்கிறது. கம்பைல் நேரத்தில் வகை சரிபார்ப்பை பராமரிக்கும் போது, பல்வேறு பிற வகைகளுடன் செயல்படக்கூடிய வகைகளை வரையறுக்க அவை உங்களுக்கு உதவுகின்றன. இந்த வலைப்பதிவு இடுகை, புவியியல் இருப்பிடம் அல்லது பின்னணியைப் பொருட்படுத்தாமல், அனைத்து நிலை டெவலப்பர்களுக்கும் நடைமுறை எடுத்துக்காட்டுகள் மற்றும் நுண்ணறிவுகளை வழங்கி, மேம்பட்ட பயன்பாட்டு முறைகளை ஆராய்கிறது.
அடிப்படைகளைப் புரிந்துகொள்ளுதல்: ஒரு மீள்பார்வை
மேம்பட்ட தலைப்புகளுக்குள் செல்வதற்கு முன், அடிப்படைகளை விரைவாக நினைவுபடுத்துவோம். ஜெனரிக்ஸ் ஒரு ஒற்றை வகைக்குப் பதிலாக பல்வேறு வகைகளுடன் செயல்படக்கூடிய கூறுகளை உருவாக்க உங்களை அனுமதிக்கிறது. நீங்கள் ஒரு ஜெனரிக் வகை அளவுருவை செயல்பாட்டு அல்லது கிளாஸ் பெயருக்குப் பிறகு கோண அடைப்புக்குறிக்குள் (`<>`) அறிவிக்கிறீர்கள். இந்த அளவுரு, செயல்பாடு அல்லது கிளாஸ் பயன்படுத்தப்படும்போது பின்னர் குறிப்பிடப்படும் உண்மையான வகைக்கான ஒரு ஒதுக்கிடமாக செயல்படுகிறது.
எடுத்துக்காட்டாக, ஒரு எளிய ஜெனரிக் செயல்பாடு இதுபோல் இருக்கும்:
function identity(arg: T): T {
return arg;
}
இந்த எடுத்துக்காட்டில், T என்பது ஜெனரிக் வகை அளவுருவாகும். identity செயல்பாடு T வகையின் ஒரு வாதத்தை எடுத்து, T வகையின் மதிப்பைத் தருகிறது. நீங்கள் இந்தச் செயல்பாட்டை வெவ்வேறு வகைகளுடன் அழைக்கலாம்:
let stringResult: string = identity("hello");
let numberResult: number = identity(42);
மேம்பட்ட ஜெனரிக்ஸ்: அடிப்படைகளுக்கு அப்பால்
இப்போது, ஜெனரிக்ஸைப் பயன்படுத்துவதற்கான மேலும் நுட்பமான வழிகளை ஆராய்வோம்.
1. ஜெனரிக் வகை கட்டுப்பாடுகள்
வகை கட்டுப்பாடுகள், ஒரு ஜெனரிக் வகை அளவுருவுடன் பயன்படுத்தக்கூடிய வகைகளை கட்டுப்படுத்த உங்களை அனுமதிக்கின்றன. ஒரு ஜெனரிக் வகை குறிப்பிட்ட பண்புகள் அல்லது மெத்தடுகளைக் கொண்டிருப்பதை உறுதி செய்ய வேண்டியிருக்கும் போது இது மிகவும் முக்கியமானது. ஒரு கட்டுப்பாட்டைக் குறிப்பிட extends என்ற முக்கிய சொல்லைப் பயன்படுத்தலாம்.
ஒரு செயல்பாடு length என்ற பண்பை அணுக வேண்டும் என்று நீங்கள் விரும்பும் ஒரு எடுத்துக்காட்டைக் கவனியுங்கள்:
function loggingIdentity(arg: T): T {
console.log(arg.length);
return arg;
}
இந்த எடுத்துக்காட்டில், T ஆனது number வகையிலான length பண்பைக் கொண்ட வகைகளுக்குக் கட்டுப்படுத்தப்பட்டுள்ளது. இது arg.length-ஐப் பாதுகாப்பாக அணுக நம்மை அனுமதிக்கிறது. இந்தக் கட்டுப்பாட்டைப் பூர்த்தி செய்யாத ஒரு வகையை அனுப்ப முயற்சித்தால் கம்பைல் நேரத்தில் பிழை ஏற்படும்.
உலகளாவிய பயன்பாடு: தரவு செயலாக்கத்தை உள்ளடக்கிய சூழ்நிலைகளில், அதாவது வரிசைகள் அல்லது சரங்களுடன் பணிபுரியும் போது, நீளத்தை அடிக்கடி அறிய வேண்டியிருக்கும் போது இது குறிப்பாக பயனுள்ளதாக இருக்கும். நீங்கள் டோக்கியோ, லண்டன் அல்லது ரியோ டி ஜெனிரோவில் இருந்தாலும் இந்த முறை ஒரே மாதிரியாக செயல்படுகிறது.
2. இன்டர்ஃபேஸ்களுடன் ஜெனரிக்கைப் பயன்படுத்துதல்
ஜெனரிக்ஸ் இன்டர்ஃபேஸ்களுடன் தடையின்றி வேலை செய்கிறது, இது நெகிழ்வான மற்றும் மீண்டும் பயன்படுத்தக்கூடிய இன்டர்ஃபேஸ் வரையறைகளை உருவாக்க உங்களை அனுமதிக்கிறது.
interface GenericIdentityFn {
(arg: T): T;
}
function identity(arg: T): T {
return arg;
}
let myIdentity: GenericIdentityFn = identity;
இங்கே, GenericIdentityFn என்பது ஒரு ஜெனரிக் வகை T-ஐ எடுத்து அதே வகை T-ஐத் தரும் ஒரு செயல்பாட்டை விவரிக்கும் ஒரு இன்டர்ஃபேஸ் ஆகும். இது வகை பாதுகாப்பை பராமரிக்கும் போது வெவ்வேறு வகை கையொப்பங்களுடன் செயல்பாடுகளை வரையறுக்க உங்களை அனுமதிக்கிறது.
உலகளாவிய பார்வை: இந்த முறை வெவ்வேறு வகையான பொருள்களுக்கு மீண்டும் பயன்படுத்தக்கூடிய இன்டர்ஃபேஸ்களை உருவாக்க உங்களை அனுமதிக்கிறது. எடுத்துக்காட்டாக, வெவ்வேறு API-களில் பயன்படுத்தப்படும் தரவு பரிமாற்றப் பொருள்களுக்கு (DTOs) ஒரு ஜெனரிக் இன்டர்ஃபேஸை உருவாக்கலாம், இது உங்கள் பயன்பாடு பயன்படுத்தப்படும் பிராந்தியத்தைப் பொருட்படுத்தாமல் சீரான தரவு கட்டமைப்புகளை உறுதி செய்கிறது.
3. ஜெனரிக் கிளாஸ்கள்
கிளாஸ்களும் ஜெனரிக்காக இருக்கலாம்:
class GenericNumber {
zeroValue: T;
add: (x: T, y: T) => T;
}
let myGenericNumber = new GenericNumber();
myGenericNumber.zeroValue = 0;
myGenericNumber.add = function(x, y) { return x + y; };
இந்த GenericNumber கிளாஸ் T வகையின் மதிப்பைக் கொண்டிருக்கலாம் மற்றும் T வகையின் மீது செயல்படும் ஒரு add முறையை வரையறுக்கலாம். நீங்கள் விரும்பிய வகையுடன் கிளாஸை உருவாக்குகிறீர்கள். ஸ்டாக்ஸ் அல்லது க்யூஸ் போன்ற தரவுக் கட்டமைப்புகளை உருவாக்குவதற்கு இது மிகவும் உதவியாக இருக்கும்.
உலகளாவிய பயன்பாடு: ஒரு நிதி பயன்பாடு பல்வேறு நாணயங்களை (எ.கா., USD, EUR, JPY) சேமித்து செயலாக்க வேண்டும் என்று கற்பனை செய்து பாருங்கள். நீங்கள் ஒரு ஜெனரிக் கிளாஸைப் பயன்படுத்தி ஒரு `CurrencyAmount
4. பல வகை அளவுருக்கள்
ஜெனரிக்ஸ் பல வகை அளவுருக்களைப் பயன்படுத்தலாம்:
function swap(a: T, b: U): [U, T] {
return [b, a];
}
let result = swap("hello", 42);
// result[0] is number, result[1] is string
swap செயல்பாடு வெவ்வேறு வகைகளின் இரண்டு வாதங்களை எடுத்து, மாற்றப்பட்ட வகைகளுடன் ஒரு டூப்பிளைத் தருகிறது.
உலகளாவிய பொருத்தம்: சர்வதேச வணிகப் பயன்பாடுகளில், வெவ்வேறு வகைகளைக் கொண்ட இரண்டு தொடர்புடைய தரவுத் துண்டுகளை எடுத்து அவற்றின் டூப்பிளைத் தரும் ஒரு செயல்பாடு உங்களிடம் இருக்கலாம், அதாவது வாடிக்கையாளர் ஐடி (ஸ்டிரிங்) மற்றும் ஆர்டர் மதிப்பு (எண்). இந்த முறை எந்தவொரு குறிப்பிட்ட நாட்டிற்கும் சாதகமாக இல்லாமல் உலகளாவிய தேவைகளுக்கு ஏற்றவாறு மாற்றியமைக்கிறது.
5. ஜெனரிக் கட்டுப்பாடுகளில் வகை அளவுருக்களைப் பயன்படுத்துதல்
ஒரு கட்டுப்பாட்டிற்குள் ஒரு வகை அளவுருவைப் பயன்படுத்தலாம்.
function getProperty(obj: T, key: K) {
return obj[key];
}
let obj = { a: 1, b: 2, c: 3 };
let value = getProperty(obj, "a"); // value is number
இந்த எடுத்துக்காட்டில், K extends keyof T என்பது K ஆனது T வகையின் ஒரு கீயாக மட்டுமே இருக்க முடியும் என்பதாகும். இது பொருள் பண்புகளை மாறும் வகையில் அணுகும்போது வலுவான வகை பாதுகாப்பை வழங்குகிறது.
உலகளாவிய பயன்பாடு: மேம்பாட்டின் போது பண்பு அணுகல் சரிபார்க்கப்பட வேண்டிய உள்ளமைவு பொருள்கள் அல்லது தரவு கட்டமைப்புகளுடன் பணிபுரியும் போது இது குறிப்பாக பயனுள்ளதாக இருக்கும். இந்த நுட்பத்தை எந்த நாட்டிலும் உள்ள பயன்பாடுகளில் பயன்படுத்தலாம்.
6. ஜெனரிக் பயன்பாட்டு வகைகள்
டைப்ஸ்கிரிப்ட் பல உள்ளமைக்கப்பட்ட பயன்பாட்டு வகைகளை வழங்குகிறது, அவை பொதுவான வகை மாற்றங்களைச் செய்ய ஜெனரிக்ஸைப் பயன்படுத்துகின்றன. இவற்றில் அடங்குவன:
Partial:T-யின் அனைத்து பண்புகளையும் விருப்பமானதாக மாற்றுகிறது.Required:T-யின் அனைத்து பண்புகளையும் அவசியமானதாக மாற்றுகிறது.Readonly:T-யின் அனைத்து பண்புகளையும் படிக்க மட்டும் கூடியதாக மாற்றுகிறது.Pick:T-யிலிருந்து ஒரு தொகுதி பண்புகளைத் தேர்ந்தெடுக்கிறது.Omit:T-யிலிருந்து ஒரு தொகுதி பண்புகளை நீக்குகிறது.
எடுத்துக்காட்டாக:
interface User {
id: number;
name: string;
email: string;
}
// Partial - all properties optional
let optionalUser: Partial = {};
// Pick - only id and name properties
let userSummary: Pick = { id: 1, name: 'John' };
உலகளாவிய பயன்பாட்டு வழக்கு: API கோரிக்கை மற்றும் மறுமொழி மாதிரிகளை உருவாக்கும்போது இந்த பயன்பாடுகள் விலைமதிப்பற்றவை. எடுத்துக்காட்டாக, ஒரு உலகளாவிய இ-காமர்ஸ் பயன்பாட்டில், Partial ஒரு புதுப்பிப்பு கோரிக்கையைக் குறிக்கப் பயன்படுத்தப்படலாம் (இதில் சில தயாரிப்பு விவரங்கள் மட்டுமே அனுப்பப்படுகின்றன), அதே நேரத்தில் Readonly முகப்பில் காட்டப்படும் ஒரு தயாரிப்பைக் குறிக்கலாம்.
7. ஜெனரிக்ஸுடன் வகை அனுமானம்
டைப்ஸ்கிரிப்ட் பெரும்பாலும் நீங்கள் ஒரு ஜெனரிக் செயல்பாடு அல்லது கிளாஸிற்கு அனுப்பும் வாதங்களின் அடிப்படையில் வகை அளவுருக்களை அனுமானிக்க முடியும். இது உங்கள் குறியீட்டை சுத்தமாகவும் படிக்க எளிதாகவும் மாற்றும்.
function createPair(a: T, b: T): [T, T] {
return [a, b];
}
let pair = createPair("hello", "world"); // TypeScript infers T as string
இந்த நிலையில், இரண்டு வாதங்களும் சரங்களாக இருப்பதால் டைப்ஸ்கிரிப்ட் தானாகவே T-ஐ string என்று அனுமானிக்கிறது.
உலகளாவிய தாக்கம்: வகை அனுமானம் வெளிப்படையான வகை குறிப்புகளின் தேவையை குறைக்கிறது, இது உங்கள் குறியீட்டை மேலும் சுருக்கமாகவும் படிக்கக்கூடியதாகவும் மாற்றும். இது பல்வேறு அனுபவ நிலைகள் இருக்கக்கூடிய மாறுபட்ட மேம்பாட்டுக் குழுக்களிடையே ஒத்துழைப்பை மேம்படுத்துகிறது.
8. ஜெனரிக்ஸுடன் நிபந்தனை வகைகள்
நிபந்தனை வகைகள், ஜெனரிக்ஸுடன் இணைந்து, பிற வகைகளின் மதிப்புகளைச் சார்ந்து இருக்கும் வகைகளை உருவாக்குவதற்கான ஒரு சக்திவாய்ந்த வழியை வழங்குகின்றன.
type Check = T extends string ? string : number;
let result1: Check = "hello"; // string
let result2: Check = 42; // number
இந்த எடுத்துக்காட்டில், T ஆனது string-ஐ நீட்டித்தால் Check ஆனது string என்று மதிப்பிடப்படுகிறது, இல்லையெனில், அது number என்று மதிப்பிடப்படுகிறது.
உலகளாவிய சூழல்: சில நிபந்தனைகளின் அடிப்படையில் வகைகளை மாறும் வகையில் வடிவமைக்க நிபந்தனை வகைகள் மிகவும் பயனுள்ளதாக இருக்கும். பிராந்தியத்தின் அடிப்படையில் தரவைச் செயலாக்கும் ஒரு அமைப்பைக் கற்பனை செய்து பாருங்கள். நிபந்தனை வகைகள் பின்னர் பிராந்திய-குறிப்பிட்ட தரவு வடிவங்கள் அல்லது தரவு வகைகளின் அடிப்படையில் தரவை மாற்றப் பயன்படுத்தப்படலாம். உலகளாவிய தரவு ஆளுகைத் தேவைகளைக் கொண்ட பயன்பாடுகளுக்கு இது மிகவும் முக்கியமானது.
9. ஜெனரிக்ஸுடன் மேப் செய்யப்பட்ட வகைகளைப் பயன்படுத்துதல்
மேப் செய்யப்பட்ட வகைகள் மற்றொரு வகையின் அடிப்படையில் ஒரு வகையின் பண்புகளை மாற்ற உங்களை அனுமதிக்கின்றன. நெகிழ்வுத்தன்மைக்காக அவற்றை ஜெனரிக்ஸுடன் இணைக்கவும்:
type OptionsFlags = {
[K in keyof T]: boolean;
};
interface FeatureFlags {
darkMode: boolean;
notifications: boolean;
}
// Create a type where each feature flag is enabled (true) or disabled (false)
let featureFlags: OptionsFlags = {
darkMode: true,
notifications: false,
};
OptionsFlags வகை ஒரு ஜெனரிக் வகை T-ஐ எடுத்து, T-யின் பண்புகள் இப்போது பூலியன் மதிப்புகளுக்கு மேப் செய்யப்படும் ஒரு புதிய வகையை உருவாக்குகிறது. உள்ளமைவுகள் அல்லது அம்சக் கொடிகளுடன் பணிபுரிய இது மிகவும் சக்தி வாய்ந்தது.
உலகளாவிய பயன்பாடு: இந்த முறை பிராந்திய-குறிப்பிட்ட அமைப்புகளின் அடிப்படையில் உள்ளமைவு திட்டங்களை உருவாக்க அனுமதிக்கிறது. இந்த அணுகுமுறை டெவலப்பர்களுக்கு பிராந்திய-குறிப்பிட்ட உள்ளமைவுகளை (எ.கா., ஒரு பிராந்தியத்தில் ஆதரிக்கப்படும் மொழிகள்) வரையறுக்க அனுமதிக்கிறது. இது உலகளாவிய பயன்பாட்டு உள்ளமைவு திட்டங்களை எளிதாக உருவாக்கவும் பராமரிக்கவும் அனுமதிக்கிறது.
10. `infer` முக்கிய சொல்லுடன் மேம்பட்ட அனுமானம்
infer முக்கிய சொல் நிபந்தனை வகைகளுக்குள் மற்ற வகைகளிலிருந்து வகைகளை பிரித்தெடுக்க உங்களை அனுமதிக்கிறது.
type ReturnType any> = T extends (...args: any) => infer R ? R : any;
function myFunction(): string {
return "hello";
}
let result: ReturnType = "hello"; // result is string
இந்த எடுத்துக்காட்டு infer முக்கிய சொல்லைப் பயன்படுத்தி ஒரு செயல்பாட்டின் ரிட்டர்ன் வகையை அனுமானிக்கிறது. இது மேலும் மேம்பட்ட வகை கையாளுதலுக்கான ஒரு நுட்பமான நுட்பமாகும்.
உலகளாவிய முக்கியத்துவம்: சிக்கலான செயல்பாட்டு கையொப்பங்கள் மற்றும் சிக்கலான தரவு கட்டமைப்புகளுடன் பணிபுரியும் போது வகை பாதுகாப்பை வழங்க பெரிய, பரவலாக்கப்பட்ட உலகளாவிய மென்பொருள் திட்டங்களில் இந்த நுட்பம் இன்றியமையாததாக இருக்கும். இது மற்ற வகைகளிலிருந்து மாறும் வகையில் வகைகளை உருவாக்க அனுமதிக்கிறது, குறியீடு பராமரிப்பை மேம்படுத்துகிறது.
சிறந்த நடைமுறைகள் மற்றும் குறிப்புகள்
- அர்த்தமுள்ள பெயர்களைப் பயன்படுத்தவும்: உங்கள் ஜெனரிக் வகை அளவுருக்களுக்கு விளக்கமான பெயர்களைத் தேர்வுசெய்யவும் (எ.கா.,
TValue,TKey) வாசிப்புத்திறனை மேம்படுத்த. - உங்கள் ஜெனரிக்ஸை ஆவணப்படுத்துங்கள்: உங்கள் ஜெனரிக் வகைகள் மற்றும் கட்டுப்பாடுகளின் நோக்கத்தை விளக்க JSDoc கருத்துகளைப் பயன்படுத்தவும். குழு ஒத்துழைப்புக்கு, குறிப்பாக உலகம் முழுவதும் பரவியுள்ள குழுக்களுடன் இது மிகவும் முக்கியமானது.
- எளிமையாக வைத்திருங்கள்: உங்கள் ஜெனரிக்ஸை அதிகமாக வடிவமைப்பதைத் தவிர்க்கவும். எளிய தீர்வுகளுடன் தொடங்கி, உங்கள் தேவைகள் உருவாகும்போது மறுசீரமைக்கவும். அதிகப்படியான சிக்கல் சில குழு உறுப்பினர்களுக்கு புரிந்துகொள்வதைத் தடுக்கலாம்.
- வரம்பைக் கருத்தில் கொள்ளுங்கள்: உங்கள் ஜெனரிக் வகை அளவுருக்களின் வரம்பை கவனமாக பரிசீலிக்கவும். எதிர்பாராத வகை பொருத்தமின்மைகளைத் தவிர்க்க அவை முடிந்தவரை குறுகியதாக இருக்க வேண்டும்.
- இருக்கும் பயன்பாட்டு வகைகளைப் பயன்படுத்துங்கள்: முடிந்தவரை டைப்ஸ்கிரிப்ட்டின் உள்ளமைக்கப்பட்ட பயன்பாட்டு வகைகளைப் பயன்படுத்தவும். அவை உங்கள் நேரத்தையும் முயற்சியையும் மிச்சப்படுத்தலாம்.
- முழுமையாக சோதிக்கவும்: உங்கள் ஜெனரிக் குறியீடு பல்வேறு வகைகளுடன் எதிர்பார்த்தபடி செயல்படுவதை உறுதிசெய்ய விரிவான யூனிட் சோதனைகளை எழுதுங்கள்.
முடிவுரை: உலகளவில் ஜெனரிக்ஸின் சக்தியைத் தழுவுதல்
டைப்ஸ்கிரிப்ட் ஜெனரிக்ஸ் வலுவான மற்றும் பராமரிக்கக்கூடிய குறியீட்டை எழுதுவதன் ஒரு மூலக்கல்லாகும். இந்த மேம்பட்ட முறைகளில் தேர்ச்சி பெறுவதன் மூலம், உங்கள் ஜாவாஸ்கிரிப்ட் பயன்பாடுகளின் வகை பாதுகாப்பு, மறுபயன்பாடு மற்றும் ஒட்டுமொத்த தரத்தை கணிசமாக மேம்படுத்தலாம். எளிய வகை கட்டுப்பாடுகள் முதல் சிக்கலான நிபந்தனை வகைகள் வரை, ஜெனரிக்ஸ் உலகளாவிய பார்வையாளர்களுக்காக அளவிடக்கூடிய மற்றும் பராமரிக்கக்கூடிய மென்பொருளை உருவாக்கத் தேவையான கருவிகளை வழங்குகிறது. உங்கள் புவியியல் இருப்பிடத்தைப் பொருட்படுத்தாமல் ஜெனரிக்ஸைப் பயன்படுத்துவதற்கான கொள்கைகள் சீராகவே இருக்கும் என்பதை நினைவில் கொள்ளுங்கள்.
இந்தக் கட்டுரையில் விவாதிக்கப்பட்ட நுட்பங்களைப் பயன்படுத்துவதன் மூலம், நீங்கள் சிறந்த கட்டமைக்கப்பட்ட, மிகவும் நம்பகமான மற்றும் எளிதில் விரிவாக்கக்கூடிய குறியீட்டை உருவாக்கலாம், இது இறுதியில் நீங்கள் ஈடுபட்டுள்ள நாடு, கண்டம் அல்லது வணிகத்தைப் பொருட்படுத்தாமல் மிகவும் வெற்றிகரமான மென்பொருள் திட்டங்களுக்கு வழிவகுக்கும். ஜெனரிக்ஸைத் தழுவுங்கள், உங்கள் குறியீடு உங்களுக்கு நன்றி தெரிவிக்கும்!